<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>制造数据</title>
</head>

<body>
    <!-- 制造数据 -->
    <!-- 默认字段 -->


    <!-- 数据类型：JSON，表格，CSV -->

    <div>数据类型：<select onchange="file_type(this.value)">
            <option value="json">JSON</option>
            <option value="txt">TXT</option>
            <option value="csv">CSV</option>
        </select>
        执行公式：<select onchange="fun_name(this.value)">
            <option value="水质数据">水质数据</option>
            <option value="水质数据">水质数据</option>
        </select>

        <input type="text" id="data_num" placeholder="请输入数据数量" value="10">
        <button onclick="make_data()">开始生成数据</button>
    </div>

    <div>
        <textarea id="fun_txt" rows="20" style="width: 100%;"></textarea>
    </div>

</body>
<script>
    // 数据类型
    let f_type = "json";
    // 公式名称
    let f_name = "水质数据";
    // 当前公式内容
    let f_txt = "";
    // 生成的数据
    let f_data = [];
    // 水务数据
    水质数据 = function () {
        // 名称，数据类型，初始数值，初始值分布，最高值，最低值，结果保留小数位
        const data = [
            { "名称": 'Qmax', "数据类型": 'number', "初始数值": '21500', "初始值分布": 'uniform', "最高值": '30000', "最低值": '10000', "结果保留小数位": 0 },
            { "名称": 'So', "数据类型": 'number', "初始数值": '180', "初始值分布": 'normal', "最高值": '300', "最低值": '50', "结果保留小数位": 0 },
            { "名称": 'MLSS', "数据类型": 'number', "初始数值": '4000', "初始值分布": 'uniform', "最高值": '8000', "最低值": '2000', "结果保留小数位": 0 },
            { "名称": 'Nk', "数据类型": 'number', "初始数值": '50', "初始值分布": 'normal', "最高值": '100', "最低值": '20', "结果保留小数位": 0 },
            { "名称": 'Nt', "数据类型": 'number', "初始数值": '65', "初始值分布": 'normal', "最高值": '120', "最低值": '30', "结果保留小数位": 0 }
        ];
        return data;
    }
    function file_type(type) {
        f_type = type;
        console.log("选择的数据类型是：" + type);
    }
    function fun_name(name) {
        // 函数名称转函数
        let fun = window[name];
        let data = fun();
        f_txt = data;
        // JSON.stringify 换行符
        document.getElementById('fun_txt').value = JSON.stringify(f_txt, null, 2);;
        console.log("选择的执行公式是：" + name);
    }
    // 生成数据
    function make_data() {
        // 公式内容
        f_txt = document.getElementById('fun_txt').value;
        // 数据数量
        let data_num = document.getElementById('data_num').value;
        // 字符串转JSON
        f_txt = JSON.parse(f_txt);
        f_data = [];
        // 使用for循环遍历数组
        for (let i = 0; i < f_txt.length; i++) {
            let item = f_txt[i];
            f_data[i] = [];
            // 循环数据数量
            for (let j = 0; j < data_num; j++) {
                // 转浮点数，生成随机数
                let random_num = Math.random() * (parseFloat(item.最高值) - parseFloat(item.最低值)) + parseFloat(item.最低值);
                // 初始值分布
                if (item.初始值分布 == "uniform") {
                    random_num = parseFloat(item.初始数值);
                } else if (item.初始值分布 == "normal") {
                    random_num = parseFloat(item.初始数值);
                }
                // 保留小数位
                random_num = random_num.toFixed(item.结果保留小数位);
                // 赋值
                f_data[i][j] = random_num;
                console.log(random_num);
            }
        };
        console.log(f_data);
        download_data();
    }
    // fun_name(f_name);
    // 下载数据
    function download_data() {
        // 转置数组
        // f_data = transpose(f_data);
        // 表头
        let t_name = f_txt.map(item => item.名称);
        let txt = "";
        if (f_type == "json") {
            // 二维数组转JSON 带键值对
            txt = JSON.stringify(Object.fromEntries(f_data.map((row, i) => [t_name[i], row])), null, 2);
        } else if (f_type == "txt") {
            f_data = transpose(f_data);
            // 第一行添加字段名称
            f_data.unshift(t_name);
            txt = f_data.map(row => row.join('\t')).join('\n');
        } else if (f_type == "csv") {
            f_data = transpose(f_data);
            // 第一行添加字段名称
            f_data.unshift(t_name);
            txt = f_data.map(row => row.join(',')).join('\n');
        }
        // 将数据写入文件
        let blob = new Blob([txt], { type: f_type });
        let a = document.createElement('a');
        a.href = URL.createObjectURL(blob);
        a.download = f_name + '.' + f_type;
        a.click();
        URL.revokeObjectURL(a.href);
    }
    // 二维数组行列变换
    function transpose(arr) {
        return arr[0].map((col, i) => arr.map(row => row[i]));
    }
</script>

</html>